//
// Created by henry on 2025/11/7.
//

#include "front_user.h"

// 全局变量：存储当前登录用户的ID，初始值-1表示未登录
int login_user_id = -1;

// 前端用户登录函数
// 功能：验证用户输入的用户名和密码，成功则记录用户ID并返回0，失败返回-1
int front_user_login(){
    printf("前端用户登录!\n");
    FrontUser user;  // 定义FrontUser结构体变量，用于存储用户输入的登录信息

    // 获取用户输入的用户名
    printf("输入用户名:");
    scanf("%s",user.username);
    // 获取用户输入的密码
    printf("输入密码:");
    scanf("%s",user.password);

    // 查询该账号是否存在：通过count(*)统计匹配用户名和密码的记录数
    // SQL语句：查询front_user表中用户名和密码与输入一致的记录数量
    const char * sql =
            "select count(*) from front_user where username=? and password=?";

    sqlite3_stmt * stmt;  // SQLite预编译语句句柄，用于处理SQL执行

    // 预编译SQL语句：将SQL字符串编译为可执行的字节码
    // 参数：数据库句柄db、SQL语句、长度（-1表示自动计算）、输出句柄、未使用部分
    int rc = sqlite3_prepare_v2(db,sql,-1,&stmt,NULL);
    if(rc!=SQLITE_OK){  // 预编译失败
        fprintf(stderr,"front_user_login:编译出错!\n");
        return -1;
    }

    // 绑定参数到SQL语句的占位符（SQLite参数索引从1开始）
    // 绑定第一个参数：用户名（文本类型）
    sqlite3_bind_text(stmt,1,user.username,-1,SQLITE_TRANSIENT);
    // 绑定第二个参数：密码（文本类型）
    sqlite3_bind_text(stmt,2,user.password,-1,SQLITE_TRANSIENT);
    //执行查询:在表中读一次记录，会返回读取的状态:
    // SQLITE_ROW 说明读取到了，此时就可以获取改行的值
    // SQLITE_DONE 或者其他状态 说明没读取到，就不能去获取值

    // 执行查询：sqlite3_step返回查询状态
    // SQLITE_ROW：表示查询到一行数据；SQLITE_DONE：表示查询结束（无更多数据）
    rc = sqlite3_step(stmt);

    int rowcount = 0;  // 用于存储查询到的匹配记录数
    if(rc==SQLITE_ROW){  // 成功查询到数据
        // 获取查询结果的第0列（count(*)的结果），类型为整数
        rowcount = sqlite3_column_int(stmt,0);
    }

    // 释放预编译语句资源，避免内存泄漏
    sqlite3_finalize(stmt);

    if (rowcount==0){  // 无匹配记录，登录失败
        printf("该账号不存在,登陆失败!\n");
        return -1;
    } else{  // 有匹配记录，进一步查询用户ID
        // SQL语句：查询该用户名和密码对应的用户ID
        const char *get_id_sql =
                "select id from front_user where username=? and password=?";

        // 预编译查询用户ID的SQL语句
        rc = sqlite3_prepare_v2(db, get_id_sql, -1, &stmt, NULL);
        if (rc != SQLITE_OK) {  // 预编译失败
            fprintf(stderr, "查询用户ID失败: %s\n", sqlite3_errmsg(db));
            return -1;
        }

        // 绑定用户名和密码参数（与登录验证一致）
        sqlite3_bind_text(stmt, 1, user.username, -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(stmt, 2, user.password, -1, SQLITE_TRANSIENT);

        // 执行查询并获取用户ID
        if (sqlite3_step(stmt) == SQLITE_ROW) {
            // 获取第0列的ID值（整数类型），并赋值给全局变量login_user_id
            login_user_id = sqlite3_column_int(stmt, 0);
            printf("账号存在，登陆成功! 用户ID：%d\n", login_user_id);
        }

        // 释放预编译语句资源
        sqlite3_finalize(stmt);
        return 0;  // 登录成功
    }
}

// 前端用户注册函数
// 功能：将用户输入的用户名和密码插入数据库，成功返回0，失败返回-1
int front_user_regist(){
    printf("前端用户注册!\n");
    FrontUser user;  // 定义FrontUser结构体变量，存储用户输入的注册信息

    // 获取用户输入的用户名
    printf("输入用户名:");
    scanf("%s",user.username);
    // 获取用户输入的密码
    printf("输入密码:");
    scanf("%s",user.password);

    // SQL语句：向front_user表插入新用户的用户名和密码
    const char * sql = "insert into front_user (username,password) values (?,?);";
    sqlite3_stmt * stmt;  // SQLite预编译语句句柄

    // 预编译插入语句
    int rc = sqlite3_prepare_v2(db,sql,-1,&stmt,NULL);
    if(rc!=SQLITE_OK){  // 预编译失败
        fprintf(stderr,"front_user_regist:编译出错了:%s\n", sqlite3_errmsg(db));
        return -1;
    }

    // 绑定参数到占位符：用户名（第1个参数）和密码（第2个参数）
    sqlite3_bind_text(stmt,1,user.username,-1,SQLITE_TRANSIENT);
    sqlite3_bind_text(stmt,2,user.password,-1,SQLITE_TRANSIENT);

    // 执行插入操作：SQLITE_DONE表示插入成功（无返回数据的语句执行结束）
    rc = sqlite3_step(stmt);
    if(rc!=SQLITE_DONE){  // 插入失败
        printf("注册失败!\n");
        sqlite3_finalize(stmt);  // 释放资源
        return -1;
    }

    // 插入成功，提示信息并释放资源
    printf("注册成功!\n");
    sqlite3_finalize(stmt);

    return 0;  // 注册成功
}